﻿#include "study04.h"
// C/C++ 学习网站：https://legacy.cplusplus.com 注意旧版本（搜索）string

struct Vector //: public string // 继承 string 类
{
    float x, y;
    Vector() : x(0), y(0) {}
    Vector(float x = 0.0f, float y = 0.0f) : x(x), y(y) {}

    Vector add(const Vector& v) const {
        return Vector(x + v.x, y + v.y);
        // return *this + v; // 在函数中调用运算符重载方法，结合 operator+ 中的注释行
        // 上行注释还可以写为：return operator+(v);
    }

    Vector operator+(const Vector& v_add) const { // 重载 + 运算符，只针对 Vector 类
        return add(v_add);
        // return Vector(x + v.x, y + v.y); // 注释行
    }

    Vector multiply(const Vector& v) const {
        return Vector(x * v.x, y * v.y);
    }

    Vector operator*(const Vector& v_mul) const { // 重载 * 运算符
        return multiply(v_mul);
    }

    bool operator==(const Vector& v) const { // 重载 == 运算符
        return x == v.x && y == v.y;
    }

    bool operator!=(const Vector& v) const { // 重载 != 运算符
        return !(*this == v); // 也可以写为 return !operator==(v); 比较奇怪
    }
};

void print_Vector(const Vector& v)
{
    std::cout << "Vector(" << v.x << ", " << v.y << ")" << std::endl;
}

std::ostream& operator<<(std::ostream& os, const Vector& v) // 重载 << 运算符
{ // 实现输出 Vector 类对象到控制台，std::ostream 是一个用于输出流的类
    std::cout << v.x << ", " << v.y << std::endl; // 输出 x, y 坐标到控制台
    return os; // 返回输出流对象，以便链式输出
}

void test_overload()
{
    Vector v1(1.0f, 1.0f);
    Vector spd1(2.5f, 3.5f);
    Vector pup1(1.1f, 1.1f);
    Vector result = v1.add(spd1.multiply(pup1)); // 函数法，也是其他语言唯一的方式
    print_Vector(result);

    Vector v2(2.0f, 2.0f);
    Vector spd2(3.5f, 2.5f);
    Vector pup2(2.1f, 2.1f);
    print_Vector(v2 + spd2 * pup2); // 运算符法

    // 重载 << 运算符，实现输出 Vector 类对象到控制台
    std::cout << v1 << spd1 << pup1; // 输出 v1, spd1, pup1 到控制台

    // 重载 == 与 != 运算符，实现 Vector 类对象的比较
    Vector v3(1.0f, 1.0f);
    if (v3 == v1)
        std::cout << "v3 == v1" << std::endl;
    if (v3 != v2)
        std::cout << "v3 != v2" << std::endl;
}